package com.my.study.handler;

import com.my.study.enums.BusinessExceptionEnum;
import com.my.study.enums.CheckTypeEnum;
import com.my.study.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;

@Slf4j
public class FileCheckHandler {

    /**
     * 文件校验
     *
     * @param checkTypeEnums
     * @param multipartFile
     * @param suffix
     */
    public static void checkFileCommon(CheckTypeEnum[] checkTypeEnums, MultipartFile multipartFile, String[] suffix, long fileSize) {
        for (CheckTypeEnum checkTypeEnum : checkTypeEnums) {
            if (CheckTypeEnum.FILE_SUFFIX.equals(checkTypeEnum)) {
                checkFileType(multipartFile, suffix);
            }
            if (CheckTypeEnum.FILE_SIZE.equals(checkTypeEnum)) {
                checkFileSize(multipartFile, fileSize);
            }
        }

    }

    /**
     * 文件数量校验
     *
     * @param fileMap
     * @param checkTypeEnums
     * @param fileNum
     */
    public static void checkFileNum(Map<String, MultipartFile> fileMap, CheckTypeEnum[] checkTypeEnums, int fileNum) {
        // 是否需要校验数量
        Optional<CheckTypeEnum> optional = Arrays.stream(checkTypeEnums).filter(CheckTypeEnum.FILE_NUM::equals).findFirst();
        if (!optional.isPresent()) {
            return;
        }
        // 数量校验
        if (fileMap == null || fileMap.size() != fileNum) {
            log.error("上传文件数量超出限制!");
            throw BusinessException.fail(BusinessExceptionEnum.FAIL.code, "上传文件数量超出限制！");
        }
    }

    /**
     * 校验文件类型
     *
     * @param multipartFile
     * @param suffix
     */
    public static void checkFileType(MultipartFile multipartFile, String[] suffix) {
        // 文件集合
        List<String> list = Arrays.asList(suffix);
        // 获取文件后最
        String originalFilename = multipartFile.getOriginalFilename();
        String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));
        if (!list.contains(fileType)) {
            log.error("不支持当前文件上传!");
            throw BusinessException.fail(BusinessExceptionEnum.FAIL.code, fileType + "不支持当前文件上传！");
        }
    }

    /**
     * 校验文件大小
     *
     * @param multipartFile
     * @param fileSize
     */
    public static void checkFileSize(MultipartFile multipartFile, long fileSize) {
        if (multipartFile.getSize() > fileSize) {
            log.error("上传的文件超出文件最大限制!");
            throw BusinessException.fail(BusinessExceptionEnum.FAIL.code, "上传的文件超出文件最大限制！");
        }
    }

}
